var fs = require("fs");
// r	以读取模式打开文件。如果文件不存在抛出异常。
// r+	以读写模式打开文件。如果文件不存在抛出异常。
// rs	以同步的方式读取文件。
// rs+	以同步的方式读取和写入文件。
// w	以写入模式打开文件，如果文件不存在则创建。
// wx	类似 'w'，但是如果文件路径存在，则文件写入失败。
// w+	以读写模式打开文件，如果文件不存在则创建。
// wx+	类似 'w+'， 但是如果文件路径存在，则文件读写失败。
// a	以追加模式打开文件，如果文件不存在则创建。
// ax	类似 'a'， 但是如果文件路径存在，则文件追加失败。
// a+	以读取追加模式打开文件，如果文件不存在则创建。
// ax+	类似 'a+'， 但是如果文件路径存在，则文件读取追加失败。
// // 异步读取  在readFile动作的函数中加回调函数错误，错误先行
// fs.readFile('input.txt', function (err, data) {
//     if (err) {
//         return console.error(err);
//     }
//     console.log("异步读取: " + data.toString());
// });

/*
    同步读取文件  没有回调函数
*/
// var data = fs.readFileSync('input.txt');
// console.log("同步读取: " + data.toString());

// console.log("程序执行完毕。");

// fs.open方法四个参数(path，flags,model,callback) 文件路径，打开的行为，文件权限，回调函数
// fs.open('./input.txt','r',(err,stats)=>{
//     if(err){
//         return console.error(err)
//     }
//     console.log(stats,'文件打开')
// })
// 获取文件信息 fs.stat(path, callback) 文件路径。 带有两个参数如：(err, stats), stats 是 fs.Stats 对象。
// fs.stat('../main.js',(err,stats)=>{
//     if(err){
//         return console.error(err);
//     }
//     console.log(stats,'获取文件信息'); //返回对应属性，文件mode uid size等
//     console.log(stats.isFile());
// })

// stats.isFile()	如果是文件返回 true，否则返回 false。
// stats.isDirectory()	如果是目录返回 true，否则返回 false。
// stats.isBlockDevice()	如果是块设备返回 true，否则返回 false。
// stats.isCharacterDevice()	如果是字符设备返回 true，否则返回 false。
// stats.isSymbolicLink()	如果是软链接返回 true，否则返回 false。
// stats.isFIFO()	如果是FIFO，返回true，否则返回 false。FIFO是UNIX中的一种特殊类型的命令管道。
// stats.isSocket()	如果是 Socket 返回 true，否则返回 false。

// 写入文件，没有就会自动创建文件
// fs.writeFile('./input.txt','使用fs.writeFile 23 123456',(err)=>{
//     if(err){
//         return console.log(err);
//     }
//     console.log("数据写入成功！");
//     console.log('-------- 开始读取'+ new Date() +' --------')
//     fs.readFile('./input.txt',function(err,data){
//         if(err){
//             return console.log(err);
//         }
//         console.log(data); //读取出一个buffer <Buffer e4 bd bf e7 94 a8 66 73 2e 77 72 69 74 65 46 69 6c 65>
//         console.log('异步读取文件数据' + data.toString());
//     })
// })



/*
    异步读取文件
*/
// fd - 通过 fs.open() 方法返回的文件描述符。
// buffer - 数据写入的缓冲区。
// offset - 缓冲区写入的写入偏移量。
// length - 要从文件中读取的字节数。
// position - 文件读取的起始位置，如果 position 的值为 null，则会从当前文件指针的位置读取。
// callback - 回调函数，有三个参数err, bytesRead, buffer，err 为错误信息， bytesRead 表示读取的字节数，buffer 为缓冲区对象。

// var buf = new Buffer.alloc(1024);
// console.log('打开文件');
// fs.open('./input.txt','r+',(err,fd)=>{
//     if(err){
//         return console.log(err);
//     }
//     console.log('文件打开成功' + fd)
//     fs.read(fd,buf,0,buf.length,0,(err,bytes)=>{
//         if(err){
//             return console.log(err);
//         }
//         console.log('读取的长度是'+bytes)
//         // 仅输出读取的字节  如果输出的字节大于0,有内容
//         if(bytes > 0){
//             console.log(buf.slice(0, bytes).toString());//截取buf 0到这个文件的字节长度,转化为字符串
//         }
//         fs.close(fd,(err)=>{
//             if(err){
//                 return console.log(err);
//             }
//             console.log('关闭文件成功')
//         })
//     })
// })


/*
    截取文件
*/
// fs.ftruncate(fd, len, callback)
// fd - 通过 fs.open() 方法返回的文件描述符。
// len - 文件内容截取的长度。
// callback - 回调函数，没有参数。
// var buf = new Buffer.alloc(1024);
// console.log("准备打开文件！");
// fs.open('./input.txt','r+',(err,fd)=>{
//     if(err){
//         return console.log(err);
//     }
//     console.log("准备截取文件！");
//     // 截取这个文件的25个字节,会改变文件
//     fs.ftruncate(fd,25,(err)=>{
//         if(err){
//             return console.log(err);
//         }
//         // 读取文件
//         fs.read(fd,buf,0,buf.length,0,(err,bytes)=>{
//             if(err){
//                 return console.log(err);
//             }
//             console.log('字节数' + bytes)
//             if(bytes>0){
//                 // 拿到buf的内容转换成字符串
//                 console.log(buf.slice(0,bytes).toString());
//             }
//             fs.close(fd,(err)=>{
//                 if(err){
//                     return console.log(err);
//                 }
//                 console.log('关闭文件成功')
//             })
//         })
//     })
// })

/*
    删除文件
*/
// fs.unlink(path, callback)

// console.log("准备删除文件！");
// fs.unlink('../static/txt/test.txt', function(err) {
//    if (err) {
//        return console.error(err);
//    }
//    console.log("文件删除成功！");
// });

/*
    创建目录
*/
// path - 文件路径。
// options 参数可以是：
// recursive - 是否以递归的方式创建目录，默认为 false。
// mode - 设置目录权限，默认为 0777。
// callback - 回调函数，没有参数。
// fs.mkdir(path[, options], callback)

// var fs = require("fs");
// // tmp 目录必须存在  创建的文件夹或者js txt以及其他类型
// console.log("创建目录 /tmp/test/test.txt");
// //  { recursive: true } 参数 放在回调函数前,不管目录在不在都能创建  错误就 if (err) throw err;
// fs.mkdir("../static/txt1/测试创建没有目录的文件.txt",{ recursive: true },function(err){
//     if (err) {
//         return console.error(err);
//     }
//     console.log("目录创建成功。");
// });

/*
    读取目录
*/
// fs.readdir(path, callback)
// path - 文件路径。
// callback - 回调函数，回调函数带有两个参数err, files，err 为错误信息，files 为 目录下的文件数组列表。
console.log("查看 ../js 目录");
fs.readdir("../js",function(err, files){
    if (err) {
        return console.error(err);
    }
    // files.forEach 遍历目类文件
    files.forEach( function (file){
        console.log( file );
    });
})


/*
    删除目录
*/ 
// fs.rmdir(path, callback)
// path - 文件路径。
// callback - 回调函数，没有参数。
// var fs = require("fs");
// 执行前创建一个空的 ../static/txt1/测试创建没有目录的文件.txt 目录
// console.log("准备删除目录 ../static/txt1/测试创建没有目录的文件.txt");
// fs.rmdir("../static/txt1/测试创建没有目录的文件.txt",function(err){
//     if (err) {
//         return console.error(err);
//     }
//     console.log("读取 ../static/txt1/测试创建没有目录的文件.txt 目录");
//     fs.readdir("../static/txt1/测试创建没有目录的文件.txt",function(err, files){
//         if (err) {
//             return console.error(err);
//         }
//         files.forEach( function (file){
//             console.log( file );
//         });
//     });
// });

